package platform.common.bo;

import java.io.Serializable;
import java.util.List;

import platform.common.dao.IDomainProviderSet;
import platform.common.dao.impl.DaoException;
import platform.common.exception.BusinessException;


import platform.common.bo.INestedSetTreeNode;

public interface INestedSetTreeNode {

	/**
	 *
	 * <br/>方法描述:根据id获取对象
	 * @param domainProviderSet 业务领域提供者集合
	 * @return
	 * @throws BusinessException
	 */
	public INestedSetTreeNode getTreeNodeById(IDomainProviderSet domainProviderSet)throws BusinessException;

	/**
	 * <br/>方法描述:获得子结构节点
	 * @param domainProviderSet 业务领域提供者集合
	 * @return 子结构节点集合
	 */
	List getChildren(IDomainProviderSet domainProviderSet)throws BusinessException;

	/**
	 * <br/>方法描述:保存节点数据
	 * @param domainProviderSet 业务领域提供者集合
	 */
	void store(IDomainProviderSet domainProviderSet)throws BusinessException;

	/**
	 * <br/>方法描述:插入一个新节点(插入子节点)
	 * @param parentId 父节点
	 * @param domainProviderSet 业务领域提供者集合
	 */
	Serializable insertIntoDB(Serializable parentId,
			IDomainProviderSet domainProviderSet)throws BusinessException;

	/**
	 * <br/>方法描述:得到父节点
	 * @param domainProviderSet 业务领域提供者集合
	 * @return 父节点
	 */
	INestedSetTreeNode getParent(IDomainProviderSet domainProviderSet)throws BusinessException;

	/**
	 * <br/>方法描述:得到所有子孙节点
	 * @param domainProviderSet 业务领域提供者集合
	 * @return 所有子孙节点集合
	 */
	List getDescendants(IDomainProviderSet domainProviderSet)throws BusinessException;
	
	/**
	 * <br/>方法描述:得到所有子孙节点
	 * @param domainProviderSet 业务领域提供者集合
	 * @return 所有子孙节点集合
	 */
	List getThisAndDescendants(IDomainProviderSet domainProviderSet)throws BusinessException;

	/**
	 * <br/>方法描述:得到所有叶子子孙节点
	 * @param domainProviderSet 业务领域提供者集合
	 * @return 叶子子孙节点集合
	 */
	List getLeafDescendants(IDomainProviderSet domainProviderSet)throws BusinessException;
	/**
	 * <br/>方法描述:得到id
	 * @return id
	 */
	Serializable getId();

	/**
	 * <br/>方法描述:设置id
	 * @param id
	 */
	void setId(Serializable id);
	/**
	 * <br/>方法描述:得到名称
	 * @return 名称
	 */
	String getName();

	/**
	 * <br/>方法描述:设置名称
	 * @param name 名称
	 */
	void setName(String name);
	/**
	 * <br/>方法描述:得到编码
	 * @return 编码
	 */
	String getCode();

	/**
	 * <br/>方法描述:设置编码
	 * @param code 编码
	 */
	void setCode(String code);
	/**
	 *
	 * <br/>方法描述: 获取说明
	 * @return
	 */
	 String getMemo() ;
	/**
	 *
	 * <br/>方法描述: 设置说明
	 * @param memo
	 */
	 void setMemo(String memo);

	/**
	 *
	 * <br/>方法描述: 获取树左值
	 * @return
	 */
	 int getLeftValue() ;
	 /**
	  *
	  * <br/>方法描述:设置树左值
	  * @param leftValue
	  */
	 void setLeftValue(int leftValue) ;
	 /**
	  *
	  * <br/>方法描述: 获取树右值
	  * @return
	  */
	 int getRightValue() ;
	 /**
	  *
	  * <br/>方法描述: 设置树右值
	  * @param rightValue
	  */
	 void setRightValue(int rightValue);
	 /**
	  *
	  * <br/>方法描述: 获取隔离标示
	  * @return
	  */
	 String getIsolatedFlag() ;
	 /**
	  *
	  * <br/>方法描述:设置隔离标示
	  * @param isolatedFlag
	  */
	 void setIsolatedFlag(String isolatedFlag) ;
	 /**
	  *
	  * <br/>方法描述: 获取树层次
	  * @return
	  */
	 int getTreeLevel() ;
	 /**
	  *
	  * <br/>方法描述: 设置树层次
	  * @param treeLevel
	  */
	 void setTreeLevel(int treeLevel);


	/**
	 * <br/>方法描述:判断同父亲下非自己ID是否存在此名称
	 * @param domainProviderSet 业务领域提供者集合
	 * @return
	 */
	boolean exsitSameNameNotSelfInParent(IDomainProviderSet domainProviderSet,Serializable parentId)throws BusinessException;
	/**
	 *
	 * <br/>方法描述:根据id删除节点及其子孙节点
	 * @param domainProviderSet
	 * @throws BusinessException
	 */
	void deleteById(IDomainProviderSet domainProviderSet)throws BusinessException;
	/**
	 *
	 * <br/>方法描述:删除前的检查操作
	 * @param domainProviderSet
	 * @return true:可删除;false;不可删除
	 * @throws BusinessException
	 */
	boolean checkBeforeDelete(IDomainProviderSet domainProviderSet)throws BusinessException;

	/**
	 *
	 * <br/>方法描述:获取所有父节点
	 * @param domainProviderSet
	 * @return
	 * @throws BusinessException
	 */
	List getAncestors(IDomainProviderSet domainProviderSet)throws BusinessException;

	/**
	 * <br/>方法描述:插入一个新节点(插入兄弟节点)
	 * @param parentId 父节点
	 * @param domainProviderSet 业务领域提供者集合
	 */
	void insertIntoBrotherDB(Serializable brotherId,
			IDomainProviderSet domainProviderSet)throws BusinessException;

	/**
	 *
	 * <br/>方法描述:上移某个节点(同级兄弟之间)
	 * @param domainProviderSet 业务领域提供者集合
	 * @return
	 */
	public void moveUp(IDomainProviderSet domainProviderSet)throws BusinessException;
	/**
	 *
	 * <br/>方法描述:下移某个节点(同级兄弟之间)
	 * @param domainProviderSet 业务领域提供者集合
	 * @return
	 */
	public void moveDown(IDomainProviderSet domainProviderSet) throws BusinessException;

	/**
	 * <br/>方法描述:根据兄度判断同级是否存重名
	 * @param domainProviderSet 业务领域提供者集合
	 * @return true:存在同名;false:不存在同名
	 */
	public boolean exsitSameNameNotSelfByBother(IDomainProviderSet domainProviderSet,Serializable brotherId)throws BusinessException;

	/**
	 *
	 * <br/>方法描述:
	 * @param domainProviderSet 业务领域提供者集合
	 * @param changeValue 左右值改变的值
	 * @throws BusinessException
	 */
	public void updateLeftRightValue(IDomainProviderSet domainProviderSet,int changeValue)throws BusinessException;

	/**
	 *
	 * <br/>方法描述:插入一个嵌套集合树节点,不需要构造左右值
	 * domainProviderSet 业务领域提供者集合
	 * @throws DaoException
	 */
	public void insertTreeNodeNotSetLR(IDomainProviderSet domainProviderSet)throws BusinessException;

	/**
	 *
	 * <br/>方法描述:新建平台拷贝参考平台的结构,并修改id和隔离表示
	 * @param domainProviderSet
	 * @param copyTreeId参考平台id
	 * @throws BusinessException
	 */
	public int copyByTree(IDomainProviderSet domainProviderSet,String newIsolatedFlag)throws BusinessException;

	/**
	 *
	 * <br/>方法描述:把某节点及其子孙节点复制到另一个节点下
	 * @param origTreeNodeId 被复制节点id
	 * @param destTreeNodeId 复制目的节点id
	 * @throws DaoException
	 */
	public void copyTreeNode(IDomainProviderSet domainProviderSet,Serializable origTreeNodeId,Serializable destTreeNodeId)throws BusinessException;

	/**
	 *
	 * <br/>方法描述:把某节点及其子孙节点移动到另一个节点下
	 * @param origTreeNodeId 被移动节点id
	 * @param destTreeNodeId 移动目的节点id
	 * @throws DaoException
	 */
	public void moveTreeNode(IDomainProviderSet domainProviderSet,Serializable origTreeNodeId,Serializable destTreeNodeId)throws BusinessException;

	/**
	 *
	 * <br/>方法描述:产生一个uuid作为对象的id
	 */
	public abstract void generatorUUID();

}
